import com.sun.xml.internal.ws.util.StringUtils;
import org.apache.commons.io.filefilter.*;
import org.apache.commons.io.monitor.*;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.concurrent.TimeUnit;

public class MainFrame {
    //主面板
    private JPanel mainPanle;
    //文本框
    private JTextArea txtArInfo;
    //监控位置
    private JTextField txtPostion;
    //监控间隔时间，单位秒
    private JTextField txtTime;
    //过滤文件夹（排除）
    private JTextField txtFilterEx;
    //启动按钮
    private JButton btnStop;
    //结束按钮
    private JButton btnStart;
    //监控器
    private FileAlterationMonitor monitor=null;
    int monitorStatus=0;
    public MainFrame() {
        //设置界面内容
        //初始化界面参数
        //TODO 待优化为
        txtPostion.setText("D:\\Shares\\vrfile\\vrh");
        txtTime.setText("5");
        txtFilterEx.setText("vtour");
        //如果内容为空无法启动界面
        if(!txtPostion.getText().isEmpty()){
            startWatch();
        }
        //开始按钮监控
        btnStart.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(monitorStatus==0){
                    startWatch();
                }else{
                    txtArInfo.append(appendTextWrap("监听已启动，请先停止再开启"));
                }
            }
        });
        //停止按钮监控
        btnStop.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(monitorStatus!=0){
                    try {
                        monitor.stop();
                    } catch (Exception ex) {
                        txtArInfo.append(appendTextWrap("关闭异常"));
                        txtArInfo.append(appendTextWrap(ex.toString()));
                    }finally {
                        txtArInfo.append(appendTextWrap("停止监听"));
                    }
                }else{
                    txtArInfo.append(appendTextWrap("监听未启动，无需停止"));
                }

            }
        });
    }
    public void startWatch(){
        // 监控目录
        String rootDir = txtFilterEx.getText();
        // 轮询间隔 5 秒
        long interval = TimeUnit.SECONDS.toMillis(Integer.valueOf(txtTime.getText()));
        // 创建过滤器
        IOFileFilter files= FileFilterUtils.and(
                FileFilterUtils.fileFileFilter(),
                FileFilterUtils.suffixFileFilter(".jpg")
        );
        //files=new RegexFileFilter("*/*");
        IOFileFilter noFiles=FileFilterUtils.notFileFilter(new RegexFileFilter(txtFilterEx.getText()));
        IOFileFilter filter = FileFilterUtils.and(noFiles, files);
        // 使用过滤器
        FileAlterationObserver observer = new FileAlterationObserver(new File(rootDir), noFiles);
        observer.addListener(new FileListener(txtArInfo));
        //创建文件变化监听器
        monitor = new FileAlterationMonitor(interval, observer);
        // 开始监控
        try {
            txtArInfo.setText(appendTextWrap("正在监听"));
            monitor.start();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    /**
     * 添加折行符号
     * @param text
     * @return
     */
    public static String appendTextWrap(String text){
        String resultText=text+"\r\n";
        return resultText;
    }
    /**
     * 启动窗口
     * @param args
     */
    public static void main(String[] args) {
        JFrame frame=new JFrame("文件监视器");
        //设置面板
        frame.setContentPane(new MainFrame().mainPanle);
        //设置关闭按钮
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }
}
